﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RayDen.Library.Core.Primitives {
    public class QMC {
        static int[] primes = new[]{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283};

        static int rev(int i, int p) {
            return i == 0 ? i : p - i;
        }

        public static double Halton(int b, int j) { // Halton sequence with reverse permutation
            int p = primes[b]; double h = 0.0, f = 1.0 / p, fct = f;
            while (j > 0) { h += rev(j % p, p) * fct; j /= p; fct *= f; } return h;
        }


        public static float HaltonNext(int n) {
            var b = (int) DateTime.UtcNow.Ticks;
            return (float) Halton(b, n);
        }

    }
}
